﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IParameter.h"
#include "OwnerPtr.h"
#include "UniIdentity.h"

namespace gcmp
{
    class IParameter;
    class IParameterDefinition;
    class IParameterDefinitionLibrary;

    /// \brief 族类型的相关信息
    struct FamilyTypeInformation
    {
        UniIdentity FamilyTypeUid; ///< 族类型的唯一标识符
        std::wstring FamilyTypeName; ///< 族类型的名称
        std::vector<OwnerPtr<IParameter>> Parameters; ///< 族类型的参数数据对象集合，包含类型参数和实例参数
    };

    /// \brief 族文件相关信息
    struct FamilyParametersInformation
    {
        std::vector<OwnerPtr<FamilyTypeInformation>> FamilyTypeInformation; ///< 族文件中的族类型信息
        OwnerPtr<IParameterDefinitionLibrary> ParameterDefinitionLibrary; ///< 族文件中的参数定义库
    };

    /// \brief 族文件接口类。
    /// 
    /// 用于从族文件中提取信息和导出数据
    class GCMP_MODEL_INTERFACE_EXPORT IFamilyFile
    {
    public:
        /// \brief 析构函数
        virtual ~IFamilyFile() {};

        /// \brief 创建族文件接口类实例。
        ///
        /// \param filePath 族文件完整路径
        /// \return 成功返回创建的族文件接口类实例失败返回空。
        static OwnerPtr<IFamilyFile> Create(const std::wstring& filePath);

        /// \brief 获取族文件中的相关信息。
        ///
        /// \param familyParametersInformation 族文件相关信息接收参数。
        virtual void GetFamilyParametersInformation(FamilyParametersInformation& familyParametersInformation) const = 0;

        /// \brief 生成族文件的显示数据。
        ///
        /// \return 成功返回bson格式的结果失败返回空。
        virtual OwnerPtr<char[]> GenerateDisplayData() = 0;

        /// \brief 更新族文件并且生成族文件的显示数据。
        ///
        /// \param parameters 需要更新的族文档的参数
        /// \return 返回代表更新过的族文件的bson格式的族文件显示数据。
        virtual OwnerPtr<char[]> GenerateDisplayData(std::vector<OwnerPtr<IParameter>>& parameters) = 0;

        /// \brief 根据族文件的一组输入参数值获得更新后的参数值（通过表达式计算的参数）。
        ///
        /// \param[in] inputParameters 输入的一组参数值（族文件中的所有参数：类型参数+实例参数）
        /// \param[out] outputParameters 更新后的参数值 （通过表达式计算后的参数）
        /// \return 返回true代表更新成功，返回false代表更新失败
        /// \note （1） 如果想要获取更新后的表达式参数，那么输入的参数中也应该包含这个表达式参数；
        ///       （2） 如果计算出的表达式参数值未变化，不会放到输出的参数数组中去。
        virtual bool UpdateParameters(const std::vector<OwnerPtr<IParameter>>& inputParameters, std::vector<OwnerPtr<IParameter>>& outputParameters) = 0;

        /// \brief 获取构件参数缩放比例，该比例只能作用于长度参数
        /// 以缩放系数100为例  构件编辑器中的长度参数为1000，载入到项目中则会缩小为10
        /// \return familyParametersInformation 族文件相关信息接收参数。
        virtual double GetParameterScale() const = 0;
    };
}



